/**
 * @file log_utils.c
 * @brief 增强日志工具实现
 * 
 * 实现带时间戳和模块标识的增强日志功能。
 */

#include "log_utils.h"
#include "esp_log.h"
#include "esp_timer.h"

static const char *TAG = "log_utils";

// 日志系统是否初始化
static bool log_initialized = false;

/**
 * @brief 初始化日志系统
 */
void log_utils_init(void)
{
    if (!log_initialized) {
        ESP_LOGI(TAG, "日志系统初始化");
        log_initialized = true;
    }
}

/**
 * @brief 格式化时间戳
 * 
 * @param timestamp 时间戳（微秒）
 * @param buffer 缓冲区
 * @param buffer_size 缓冲区大小
 */
static void format_timestamp(int64_t timestamp, char *buffer, size_t buffer_size)
{
    // 转换为秒和毫秒
    int64_t seconds = timestamp / 1000000;
    int64_t milliseconds = (timestamp % 1000000) / 1000;
    
    // 格式化为HH:MM:SS.mmm
    int hours = (seconds / 3600) % 24;
    int minutes = (seconds / 60) % 60;
    int secs = seconds % 60;
    
    snprintf(buffer, buffer_size, "%02d:%02d:%02d.%03d", hours, minutes, secs, (int)milliseconds);
}

/**
 * @brief 打印带时间戳的日志
 * 
 * @param tag 日志标签
 * @param level 日志级别
 * @param format 格式化字符串
 * @param ... 可变参数
 */
void log_utils_printf(const char *tag, esp_log_level_t level, const char *format, ...)
{
    if (!log_initialized) {
        log_utils_init();
    }
    
    // 获取时间戳
    int64_t timestamp = esp_timer_get_time();
    char time_buffer[16];
    format_timestamp(timestamp, time_buffer, sizeof(time_buffer));
    
    // 根据日志级别打印
    va_list args;
    va_start(args, format);
    
    switch (level) {
        case ESP_LOG_ERROR:
            ESP_LOGE(tag, "[%s] ", time_buffer);
            break;
        case ESP_LOG_WARN:
            ESP_LOGW(tag, "[%s] ", time_buffer);
            break;
        case ESP_LOG_INFO:
            ESP_LOGI(tag, "[%s] ", time_buffer);
            break;
        case ESP_LOG_DEBUG:
            ESP_LOGD(tag, "[%s] ", time_buffer);
            break;
        case ESP_LOG_VERBOSE:
            ESP_LOGV(tag, "[%s] ", time_buffer);
            break;
        default:
            break;
    }
    
    // 打印实际日志内容
    esp_log_writev(level, tag, format, args);
    va_end(args);
}